<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 封装队列
    class Queue {
      
      // 配置私有属性
      #items = []


      // 删除队头
      dequeue () {
        return this.#items.shift()
        /* 
        这种封装队列的缺点 
        使用shift方法删除队列的头部 性能会很差

        假设数组里有10000个元素
        那么现在删除了队头 剩下所有的元素都需要改变原来的位置 去填补上前面的亏空
        这样已经失去了学习算法的初衷
        
        */
      }

      // 添加一条队列
      enqueue (data) {
        return this.#items.push(data)
      }

      // 取队列的头部
      front () {
        return this.#items.at(0) 
      }
      isEmpty () {
        return this.#items.length === 0
      }
      size () {
        return this.#items.length
      }
      clear () {
        this.#items = []
      }
      toString () {
        return this.#items.join('') // 可选择用什么来拼接 
      }
    }
    // let stack = new Stack()


    // 栈结构的应用
    // 封装十进制转二进制的方法
    function convert (decNumber) {
      // 先实例化类
      let remStack = new Stack()
      let number = decNumber
      let string = ""
      while (number > 0) {
        // 把余数添加到数组
        remStack.push(number % 2)
        number = Math.floor(number / 2)
      }
      while (!(remStack.isEmpty())) {
        string += remStack.pop()
      }
      return string
    }
    console.log(convert(50));


    // 可配置的 进制转换
    function newConvert (decNumber ,base ) {
      // 先实例化类
      let remStack = new Stack()
      let number = decNumber
      let string = ""
      let baseString = "0123456789ABCDEF"
      while (number > 0) {
        // 把余数添加到数组
        remStack.push(number % base)
        number = Math.floor(number / base)
      }
      while (!(remStack.isEmpty())) {
        string += baseString[remStack.pop()] 
      }
      return string
    }
    console.log(newConvert(500,16));

  </script>
</body>

</html>